//
//  Problem1624.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/18.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit
/*
 1624. 两个相同字符之间的最长子字符串
 给你一个字符串 s，请你返回 两个相同字符之间的最长子字符串的长度 ，计算长度时不含这两个字符。如果不存在这样的子字符串，返回 -1 。

 子字符串 是字符串中的一个连续字符序列。

 示例 1：
     输入：s = "aa"
     输出：0
     解释：最优的子字符串是两个 'a' 之间的空子字符串。
 示例 2：
     输入：s = "abca"
     输出：2
     解释：最优的子字符串是 "bc" 。
 示例 3：
     输入：s = "cbzxy"
     输出：-1
     解释：s 中不存在出现出现两次的字符，所以返回 -1 。
 示例 4：
     输入：s = "cabbac"
     输出：4
     解释：最优的子字符串是 "abba" ，其他的非最优解包括 "bb" 和 "" 。
 提示：
     1 <= s.length <= 300
     s 只含小写英文字母
 */
@objcMembers class Problem1624: NSObject {
    func solution() {
        print(maxLengthBetweenEqualCharacters("aa"))
        print(maxLengthBetweenEqualCharacters("abca"))
        print(maxLengthBetweenEqualCharacters("cbzxy"))
        print(maxLengthBetweenEqualCharacters("cabbac"))
        
    }
    
    /*
     字典存储字符的位置
     1: 创建一个字典charts[char: [int]]
     2: 遍历字符串，并将字符的位置，插入charts中
     3: 计算charts中相同字符的第一个和最后一个的间距
     */
    func maxLengthBetweenEqualCharacters(_ s: String) -> Int {
        if s.count == 1 {
            return -1
        }
        var charts:[Character: [Int]] = [:]
        for (i, c) in s.enumerated() {
            if charts[c] == nil {
                charts[c] = [i]
            } else {
                charts[c]!.append(i)
            }
        }
        
        var result = -1
        for value in charts.values {
            if value.count <= 1 {
                continue
            }
            result = max(result, value.last! - value.first! - 1)
        }
        
        return result
    }
}
